package com.yy.QSManage.tool;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IoUtil;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class FileUniqueIdentifier {

    /**
     * 生成文件的MD5哈希值
     * @param filePath 文件系统路径
     * @return
     */
    public static String generateFileMD5(String filePath) {
        try {
            FileInputStream fis = new FileInputStream(filePath);
            return generateFileMD5(fis);
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 生成文件的MD5哈希值
     * 默认关闭流
     * @param file
     * @return
     */
    public static String generateFileMD5(File file) {
        return generateFileMD5(IoUtil.toStream(file), true);
    }

    /**
     * 生成文件的MD5哈希值
     * 默认关闭流
     * @param fis 文件输入流
     * @return
     */
    public static String generateFileMD5(FileInputStream fis) {
        return generateFileMD5(fis, true);
    }

    /**
     * 生成文件的MD5哈希值
     * @param fis 文件输入流
     * @param isCloss 是否关闭流
     * @return
     */
    public static String generateFileMD5(FileInputStream fis, boolean isCloss) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] dataBytes = new byte[1024];
            int nread;
            while ((nread = fis.read(dataBytes)) != -1) {
                md.update(dataBytes, 0, nread);
            }
            if(isCloss){
                fis.close();
            }
            byte[] mdBytes = md.digest();

            // 转换成十六进制格式
            StringBuilder sb = new StringBuilder();
            for (byte b : mdBytes) {
                sb.append(String.format("%02x", b));
            }
            return sb.toString();
        } catch (IOException | NoSuchAlgorithmException e) {
            e.printStackTrace();
            return null;
        }
    }

}